package com.ysg.widget.tree;

import com.ysg.utils.YStringUtil;
import java.util.ArrayList;
import java.util.List;

public class TreeHelper {
    /**
     * 传入我们的普通bean，转化为我们排序后的Node
     */
    public static List<Node> getSortedNodes(List<Node> list, int defaultExpandLevel) {
        reset(list);
        List<Node> result = new ArrayList<>();
        List<Node> nodes = convertDataToNode(list);
        List<Node> rootNodes = getRootNodes(nodes);
        for (Node node : rootNodes) {
            addNode(result, node, defaultExpandLevel, 1);
        }
        return result;
    }

    /**
     * 重置
     */
    public static void reset(List<Node> list){
        for (Node node: list) {
            node.setChildren(new ArrayList<>());
            node.setExpand(false);
            node.setParent(null);
            node.setLevel(0);
        }
    }
    /**
     * 过滤出所有可见的Node：如果为跟节点，或者上层目录为展开状态
     */
    public static List<Node> filterVisibleNode(List<Node> nodes) {
        List<Node> result = new ArrayList<>();
        for (Node node : nodes) {
            if (node.isRoot() || node.isParentExpand()) {
                result.add(node);
            }
        }
        return result;
    }

    /**
     * 把一个节点上的所有的内容都挂上去
     */
    public static void addNode(List<Node> nodes, Node node, int defaultExpandLevel, int currentLevel) {
        nodes.add(node);
        if (defaultExpandLevel >= currentLevel) {
            node.setExpand(true);
        }
        if (node.isLeaf()){
            return;
        }
        for (int i = 0; i < node.getChildren().size(); i++) {
            addNode(nodes, node.getChildren().get(i), defaultExpandLevel,currentLevel + 1);
        }
    }

    /**
     * 获取根节点
     */
    public static List<Node> getRootNodes(List<Node> nodes) {
        List<Node> root = new ArrayList<>();
        for (Node node : nodes) {
            if (node.isRoot()){
                root.add(node);
            }
        }
        return root;
    }

    /**
     * 将我们的数据转化为树的节点
     */
    public static List<Node> convertDataToNode(List<Node> nodes){
        /**
         * 设置Node间，父子关系;让每两个节点都比较一次，即可设置其中的关系
         */
        for (int i = 0; i < nodes.size(); i++) {
            Node n = nodes.get(i);
            for (int j = i + 1; j < nodes.size(); j++) {
                Node m = nodes.get(j);
                if (YStringUtil.eq(m.getPId(), n.getId())) {
                    n.getChildren().add(m);
                    m.setParent(n);
                } else if (YStringUtil.eq(m.getId(), n.getPId())) {
                    m.getChildren().add(n);
                    n.setParent(m);
                }
            }
        }

        return nodes;
    }



}
